package elementary_alg.array;

/**
 * @author : Kong Decheng
 * @date : 2021/04/02
 * @description: 移动零
 */
public class LC8 {
    /**
     * 把非 0 的往前挪，挪完之后，后面的就都是 0 了，然后再用 0 覆盖后面的
     *
     * @param nums
     * @return
     */
    public void solution_1(int[] nums) {
        if (nums == null || nums.length == 0) {
            return;
        }
        // 待交换的位置
        int index = 0;
        for (int i = 0; i < nums.length; i++) {
            // 非 0 的往前挪
            if (nums[i] != 0) {
                nums[index++] = nums[i];
            }
        }
        // 把后面的数字用 0 覆盖
        while (index < nums.length) {
            nums[index++] = 0;
        }
    }

    /**
     * 双指针
     *
     * @param nums
     */
    public void solution_2(int[] nums) {
        // 统计 0 出现的次数
        int i = 0;
        for (int j = 0; j < nums.length; j++) {
            if (nums[j] == 0) {
                // 元素为 0，不操作
                i++;
            } else if (i != 0) {
                // 元素不为 0，且 0的个数不为 0，则与 j-i 交换元素,同时将 j 设为0
                nums[j - i] = nums[j];
                nums[j] = 0;
            }

        }
    }

    public void solution_3(int[] nums) {
        int i = 0;
        for (int j = 0; j < nums.length; j++) {
            // 只要元素不为0，就与 i 交换
            if (nums[j] != 0) {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
                i++;
            }
        }
    }
}
